#include <iostream>
#include <sys/types.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

// sigset_t -- 信号状态位图，阻塞信号、未决信号
// sigaddset -- 添加信号状态
// sigdelset -- 删除信号状态
// sigemptyset -- 清空信号状态
// sigfillset -- 信号状态全部为1

// sigprocmask(int how, const sigset_t* set, const sigset_t* oset);  -- 设置信号状态，并获取之前的信号状态
// sigpending(sigset_t* set) -- 获取当前的阻塞信号状态

void handler(int signum)
{
    std::cout << "recieve a signal, signum:" << signum << std::endl;
}

// 进行信号阻塞信息打印函数
void showPending(const sigset_t& pending)
{
    for(int sig = 1; sig <= 31; ++sig)
    {
        std::cout << sigismember(&pending, sig);
    }
    std::cout << std::endl;
}

int main()
{
    std::cout << "Process runing, pid:" << getpid() << std::endl;

    // 0.重新注册所有信号的处理方法
    for(int sig = 1; sig <= 31; ++sig)
    {
        signal(sig, handler);
    }

    // 1.将所有信号都设置为阻塞
    sigset_t bset, obset;
    sigset_t pending;

    sigfillset(&bset);    // 全部阻塞状态位都设为1

    // 2.载入进程
    sigprocmask(SIG_BLOCK, &bset, &obset);

    // 3.死循环显示阻塞状态信息
    for(;;)
    {
        sigpending(&pending);
        showPending(pending);
        sleep(1);
    }

    return 0;
}

// int main()
// {
//     std::cout << "Process runing, pid:" << getpid() << std::endl;

//     // 1. 重新注册2号信号的处理方法
//     signal(SIGINT, handler);

//     // 2. 创建信号状态位图
//     sigset_t bset, obset;
//     sigset_t pending;
//     sigfillset(&bset);    // 2号信号设置阻塞

//     // sigprocmask(SIG_BLOCK, &bset, &obset);

//     // 3. 将组设信号标记为加入进程PCB
//     // 将全部信号设置为阻塞状态
//     for(int sig = 1; sig <= 31; ++sig)
//     {
//         sigprocmask(sig, &bset, nullptr);
//     }

//     // sigprocmask(SIG_BLOCK, &bset, &obset);  // 将原来信号阻塞位图信息存入obset中

//     // 4. 轮巡检测，获取每个阻塞状态位的1/0值
//     // 从1-31消除阻塞状态
//     int count = 0;
//     while(true)
//     {
//         ++count;
//         sigdelset(&bset, count);
//         sigprocmask(SIG_UNBLOCK, &bset, nullptr);

//         sigpending(&pending);
//         showPending(bset);

//         // if(count == 5) 
//         // {
//         //     std::cout << "解除全部信号的BLOCK状态" << std::endl;
//         //     sigprocmask(SIG_UNBLOCK, &bset, nullptr);
//         // }

//         sleep(1);
//     }

//     return 0;
// }